package pe.com.lgutierrez.campeonato.dao.mysql.sjdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;

import pe.com.lgutierrez.campeonato.dao.EquipoDao;
import pe.com.lgutierrez.campeonato.entidad.Equipo;

@Repository
public class EquipoDaoImpl implements EquipoDao {

	
	private JdbcTemplate jdbcTemplate;
	private SimpleJdbcInsert simpleJdbcInsert;

	
	private static final String QUERYINSERTEQUIPOS = "INSERT INTO EQUIPOS(codEquipo,nombreEquipo,razonSocialEquipo," +
													"fundacion,numeroTitulos,numeroTitulosNacionales,numeroTitulosInternacionales)" +
													" VALUES(?,?,?,?,?,?,?)";
	private static final String QUERYSELECTEQUIPOS = "SELECT codEquipo,nombreEquipo,razonSocialEquipo," +
			"fundacion,numeroTitulos,numeroTitulosNacionales,numeroTitulosInternacionales FROM EQUIPOS ";
	private static final String WHERE = " WHERE";
	private static final String CONDICIONIDEQUIPO = " idEquipo = ?";
	
	
	@Autowired
	public void setJdbcTemplate(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public Equipo insertarEquipo(Equipo equipo) {
		
		/*jdbcTemplate.update(QUERYINSERTEQUIPOS, new Object[]{ equipo.getCodigoEquipo(),equipo.getNombreEquipo(),
						equipo.getDireccionEquipo(),equipo.getFundacion(),equipo.getNumeroTitulos(),
						equipo.getNumeroTitulosNacionales(),equipo.getNumeroTitulosInternacionales()});
		*/
		Map<String, ? super Object> map = new HashMap<String, Object>();
		
		if(equipo.getCodigoEquipo()!=null) map.put("codEquipo", equipo.getCodigoEquipo());
		if(equipo.getDireccionEquipo()!=null) map.put("razonSocialEquipo", equipo.getDireccionEquipo());
		if(equipo.getFundacion()!=null) map.put("fundacion", equipo.getFundacion());
		if(equipo.getNombreEquipo()!=null) map.put("nombreEquipo", equipo.getNombreEquipo());
		if(equipo.getNumeroTitulos()!=null) map.put("numeroTitulos", equipo.getNumeroTitulos());
		if(equipo.getNumeroTitulosInternacionales()!=null) map.put("numeroTitulosInternacionales", equipo.getNumeroTitulosInternacionales());
		if(equipo.getNumeroTitulosNacionales()!=null) map.put("numeroTitulosNacionales", equipo.getNumeroTitulosNacionales());
		
		 SqlParameterSource parameters = new MapSqlParameterSource(map);

		 Number newId = simpleJdbcInsert.executeAndReturnKey(parameters);
		 equipo.setIdEquipo(newId.intValue());
		 return equipo;
		
	}

	public void modificarEquipo(Equipo equipo) {
		// TODO Auto-generated method stub
		
	}

	public void eliminarEquipo(Integer idEquipo) {
		// TODO Auto-generated method stub
		
	}

	public List<Equipo> obtenerEquipos() {
		// TODO Auto-generated method stub
		List<Equipo> equipos = jdbcTemplate.query(QUERYSELECTEQUIPOS, new EquipoMapper());
		return equipos;
	}

	public List<Equipo> obtenerEquiposByParam(Map<String, String> parm) {
		// TODO Auto-generated method stub
		return null;
	}

	public Equipo obtenerEquipo(Integer idEquipo) {
		// TODO Auto-generated method stub
		try {
			Equipo equipo = jdbcTemplate.queryForObject(QUERYSELECTEQUIPOS + WHERE +CONDICIONIDEQUIPO, 
							new Object[]{idEquipo}, new EquipoMapper());
			return equipo;
		} catch (EmptyResultDataAccessException accessException) {
			// TODO: handle exception
			return null;
		}
	}
	
	public static final class EquipoMapper implements RowMapper<Equipo>{

		public Equipo mapRow(ResultSet rs, int arg1) throws SQLException {
			// TODO Auto-generated method stub
			Equipo equipo= null;
			
				equipo = new Equipo();
				equipo.setCodigoEquipo(rs.getString("codEquipo"));
				equipo.setDireccionEquipo(rs.getString("razonSocialEquipo"));
				equipo.setFundacion(rs.getDate("fundacion"));
				equipo.setNombreEquipo(rs.getString("nombreEquipo"));
				equipo.setNumeroTitulos(rs.getInt("numeroTitulos"));
				equipo.setNumeroTitulosInternacionales(rs.getInt("numeroTitulosInternacionales"));
				equipo.setNumeroTitulosNacionales(rs.getInt("numeroTitulosNacionales"));
		
			
			return equipo;
		}
		
	}

}
